package com.house.framework.service.impl;


import com.house.exception.MyException;
import com.house.framework.constant.UserConstant;
import com.house.framework.entity.User;
import com.house.framework.mapper.UserMapper;
import com.house.framework.service.IVerifycodeService;
import com.house.utils.StrUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName VerifycodeServiceImpl
 * @Version 1.0
 */
@Service
public class VerifycodeServiceImpl implements IVerifycodeService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public void smsCode(Map<String , String> param) {
        String phone = param.get("phone");
        String type = param.get("type");

        // 1. 手机号不能为空
        if(StringUtils.isEmpty(phone)) {
            throw new MyException("手机号不能为空！！！！");
        }

        if (type.equals("register")) { // 注册流程
            String rediskey = UserConstant.REGISTER_PREFIX + phone;
            // 2. 手机号是否存在，如果存在抛出异常不要重复注册
            User user = userMapper.findByPhone(phone);
            if (user != null) {
                throw new MyException("手机号已存在，请勿重复注册！！！！");
            }
            sendCode(rediskey);
        } else if (type.equals("binder")) { // 绑定流程
            String rediskey = UserConstant.BINDER_PREFIX + phone;
            sendCode(rediskey);
        }

    }

    
    /**
     *@Description 发送验证码校验
     *@Param
     *@Return
     */
    public void sendCode(String redisKey) {
        // 3. 三分中过期， 从redis中取，如果能取到，没有过期
        // key: 业务标识+手机号    register_prefix+Phone
        Object tmpCode = redisTemplate.opsForValue().get(redisKey);
        String code = null;
        if (tmpCode != null) {
            // 3.1. 判断是否再一分钟之内重复点击发送，抛出异常
            // 获取时间戳
            String time = tmpCode.toString().split(":")[0];

            // 判断是否小于一分钟
            if(System.currentTimeMillis() - Long.valueOf(time) <= 1*60*1000) {
                throw new MyException("请勿重复获取验证码");
            } else {
                // 3.2. 超过一分钟,重新刷新之前验证码的过期时间
                // 获取验证码
                code = tmpCode.toString().split(":")[1];
            }
        } else { // 如果不能取到
            // 重新生成验证码
            code = StrUtils.getComplexRandomString(4);
        }
        redisTemplate.opsForValue().set(redisKey, System.currentTimeMillis() + ":" + code, 3L, TimeUnit.MINUTES);

        // SendMsg.sendSMS(Phone, "尊敬的：陶梦娇女士，您的登录密码是：" + code + "有效期180秒，将验证码发送至微信聊天，解锁抱抱，如非本人操作，请勿泄露！");
        System.out.println(code);

    }
}
